from django.http import HttpResponse
from django.views import View
from django.http import JsonResponse

# Create your views here.


# 前段
# 　　拼接一个url　然后给img img会发送请求
#     url = http://mp-meiduo-python.itheima.net/image_codes/1f61b953-bf65-4353-bcab-a3e4dac6dbda/
#
#     url = http://ip:port/image_codes/uuid/
#
#
# 后端
#     请求　　接收路由中的uuid
#
#     业务逻辑　生成图片验证码和图片二进制　通过redis把图片验证码保存起来
#
#     响应　返回图片二进制
#
#     路由　GET 　image_codes/uuid/
#
#     步骤　
#         １．接收路由中的uuid
#         ２．生成图片验证码和图片二进制
#         ３．通过redis把图片验证码保存起来
#         ４．返回图片二进制



class ImageCodeView(View):


    def get(self,request,uuid):

        #１．接收路由中的uuid

        #２．生成图片验证码和图片二进制
        from libs.captcha.captcha import captcha
        # text 是图片验证码的内容　
        # image是图片二进制
        text,image=captcha.generate_captcha()

        #３．通过redis把图片验证码保存起来
        # 进行redis的连接
        from django_redis import get_redis_connection
        redis_cli = get_redis_connection('code')
        #redis 链接的数据保存到２号库

        #指令操作
        redis_cli.setex(uuid, 300, text)

        #４．返回图片二进制
        # 因为图片是二进制，我们不能返回Json
        # content_type =响应体数据类型
        # content_type 的语法形式是：大类/小类
        # 图片：image/jpeg, image/gif, image/png
        return HttpResponse(image, content_type='image/jpeg')


###################短信验证码#######################################################

    # 前端
    #     当用户输入手机号，图片验证码之后，前端发送一个axios请求
    #
    #     http://www.meiduo.site:8000/image_codes/46f96281-835b-4de8-8519-fb06582e9ea9/
    #
    # 后端
    #
    #     请求　　接收请求　获取请求参数（路由手机号，用户验证码和UUID在查询字符串中）
    #
    #     业务逻辑　验证参数，验证图片验证码，生成图片验证码，保存图片验证码，发送图片验证码
    #
    #     响应　返回响应
    #         {'code':0,'errmsg':'ok'}
    #
    # 路由　GET
    #
    # 步骤：　 １．获取请求参数
    #         2.验证参数
    #         3.验证图片验证码
    #         4.生成图片验证码
    #         5.保存图片验证码
    #         6.发送图片验证码
    #         7.返回响应
    #           image_codes / 46f96281 - 835b - 4de8 - 8519 - fb06582e9ea9 /



# class SmsCodeView(View):
#
#     def get(self,request,mobile):
#
#         #１．获取请求参数
#         image_code = request.GET.get('image_code')
#         uuid = request.GET.get('image_code_id')
#
#         #2.验证参数
#         if not all({image_code,uuid}):
#             return JsonResponse({'code':400, 'errmsg':'参数不全'})
#
#         #3.验证图片验证码
#         # 3.1链接redis
#         from django_redis import get_redis_connection
#         redis_cli = get_redis_connection('code')
#
#         # 3.2获取redis数据
#         redis_image_code = redis_cli.get(uuid)
#         if redis_image_code is None:
#             return JsonResponse({'code': 400, 'errmsg': '图片验证码已过期'})
#
#         # 3.3对比
#         redis_image_code = redis_image_code.decode()
#         if redis_image_code.lower() != image_code.lower():
#             return JsonResponse({'code': 400, 'errmsg': '图片验证码错误'})
#
#         #4.生成图片验证码
#         from random import randint
#         sms_code = '%06d'%randint(0,999999)
#
#         #5.保存图片验证码
#         redis_cli.setex(mobile,300, sms_code)
#
#         #6.发送图片验证码
#         from libs.yuntongxun.sms import CCP
#         CCP().send_template_sms(mobile,[sms_code, 5],1)
#
#         #7.返回响应
#         return JsonResponse({'code':0, 'errmsg':'ok'})


from libs.yuntongxun.sms import CCP
from django import http
import random
import logging
logger = logging.getLogger('django')
from django_redis import get_redis_connection

class SMSCodeView(View):
    """短信验证码"""


    def get(self, reqeust, mobile):
        """
        :param reqeust: 请求对象
        :param mobile: 手机号
        :return: JSON
        """
        # 接收参数
        image_code_client = reqeust.GET.get('image_code')
        uuid = reqeust.GET.get('image_code_id')

        # 校验参数
        if not all([image_code_client, uuid]):
            return http.JsonResponse({'code': 400, 'errmsg': '缺少必传参数'})

        # 创建连接到redis的对象
        redis_conn = get_redis_connection('code')
        # 提取图形验证码
        image_code_server = redis_conn.get('img_%s' % uuid)
        if image_code_server is None:
            # 图形验证码过期或者不存在
            return http.JsonResponse({'code': 400, 'errmsg': '图形验证码失效'})
        # 删除图形验证码，避免恶意测试图形验证码
        try:
            redis_conn.delete('img_%s' % uuid)
        except Exception as e:
            logger.error(e)
        # 对比图形验证码
        image_code_server = image_code_server.decode()  # bytes转字符串
        if image_code_client.lower() != image_code_server.lower():  # 转小写后比较
            return http.JsonResponse({'code': 400, 'errmsg': '输入图形验证码有误'})

        # 提取发送短信标记看看有没有
        redis_flag = redis_conn.get('send_flag_%s'%mobile)
        if redis_conn is None:
            return JsonResponse({'code':400,'errmsg':'请勿频繁操作'})
        # 生成短信验证码：生成6位数验证码
        sms_code = '%06d' % random.randint(0, 999999)

        # 管道三步
        # １．新建一个管道
        pipeline=redis_conn.pipline()


        logger.info(sms_code)

        # ２．管道收集指令
        # 保存短信验证码
        pipeline.setex('sms_%s' % mobile, 300, sms_code)
        # 添加一个发送标记
        pipeline.setex('send_flag_%s'%mobile,60,1)

        # ３．管道执行指令
        pipeline.execute()

        # 发送短信验证码
        # CCP().send_template_sms(mobile,[sms_code, 5], 1)

        from celery_tasks.sms.tasks import celery_send_sms_code
        # delay参数等同与任务函数的参数
        celery_send_sms_code.delay(mobile,sms_code)

        # 响应结果
        return http.JsonResponse({'code': 0, 'errmsg': '发送短信成功'})